{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f28455fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# data visualization\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "\n",
    "import tensorflow as tf\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from keras.models import Sequential\n",
    "from keras.layers import LSTM,Dense,Dropout\n",
    "from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score\n",
    "\n",
    "import math \n",
    "import os "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "506cd016",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号\n",
    "sns.set(font='SimHei')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2fd9ce76",
   "metadata": {},
   "outputs": [],
   "source": [
    "df= pd.read_csv('../dataset/min.csv')  # 读取股票文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "61c70e7a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>时间</th>\n",
       "      <th>开盘</th>\n",
       "      <th>收盘</th>\n",
       "      <th>最高</th>\n",
       "      <th>最低</th>\n",
       "      <th>成交量</th>\n",
       "      <th>成交额</th>\n",
       "      <th>最新价</th>\n",
       "      <th>code</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2021-11-19 09:30:00</td>\n",
       "      <td>17.80</td>\n",
       "      <td>17.80</td>\n",
       "      <td>17.80</td>\n",
       "      <td>17.80</td>\n",
       "      <td>4127</td>\n",
       "      <td>7346060</td>\n",
       "      <td>17.80</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2021-11-19 09:30:00</td>\n",
       "      <td>19.01</td>\n",
       "      <td>19.01</td>\n",
       "      <td>19.01</td>\n",
       "      <td>19.01</td>\n",
       "      <td>1718</td>\n",
       "      <td>3265918</td>\n",
       "      <td>19.01</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2021-11-19 09:30:00</td>\n",
       "      <td>18.84</td>\n",
       "      <td>18.84</td>\n",
       "      <td>18.84</td>\n",
       "      <td>18.84</td>\n",
       "      <td>568</td>\n",
       "      <td>1070112</td>\n",
       "      <td>18.84</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2021-11-19 09:30:00</td>\n",
       "      <td>4.12</td>\n",
       "      <td>4.12</td>\n",
       "      <td>4.12</td>\n",
       "      <td>4.12</td>\n",
       "      <td>29</td>\n",
       "      <td>11750</td>\n",
       "      <td>4.12</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2021-11-19 09:30:00</td>\n",
       "      <td>2.14</td>\n",
       "      <td>2.14</td>\n",
       "      <td>2.14</td>\n",
       "      <td>2.14</td>\n",
       "      <td>165</td>\n",
       "      <td>35310</td>\n",
       "      <td>2.14</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    时间     开盘     收盘     最高     最低   成交量      成交额    最新价  code\n",
       "0  2021-11-19 09:30:00  17.80  17.80  17.80  17.80  4127  7346060  17.80     1\n",
       "1  2021-11-19 09:30:00  19.01  19.01  19.01  19.01  1718  3265918  19.01     2\n",
       "2  2021-11-19 09:30:00  18.84  18.84  18.84  18.84   568  1070112  18.84     4\n",
       "3  2021-11-19 09:30:00   4.12   4.12   4.12   4.12    29    11750   4.12     6\n",
       "4  2021-11-19 09:30:00   2.14   2.14   2.14   2.14   165    35310   2.14     8"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "524798d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.loc[df['code'] == 600031]\n",
    "df.drop(['code'],axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5022e477",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.set_index('时间',inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9840770d",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>开盘</th>\n",
       "      <th>收盘</th>\n",
       "      <th>最高</th>\n",
       "      <th>最低</th>\n",
       "      <th>成交量</th>\n",
       "      <th>成交额</th>\n",
       "      <th>最新价</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>时间</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2021-11-19 09:30:00</th>\n",
       "      <td>21.66</td>\n",
       "      <td>21.66</td>\n",
       "      <td>21.66</td>\n",
       "      <td>21.66</td>\n",
       "      <td>3208</td>\n",
       "      <td>6948528</td>\n",
       "      <td>21.660</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-11-19 09:31:00</th>\n",
       "      <td>21.65</td>\n",
       "      <td>21.62</td>\n",
       "      <td>21.69</td>\n",
       "      <td>21.60</td>\n",
       "      <td>11702</td>\n",
       "      <td>25326434</td>\n",
       "      <td>21.647</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-11-19 09:32:00</th>\n",
       "      <td>21.61</td>\n",
       "      <td>21.65</td>\n",
       "      <td>21.66</td>\n",
       "      <td>21.61</td>\n",
       "      <td>7952</td>\n",
       "      <td>17191749</td>\n",
       "      <td>21.637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-11-19 09:33:00</th>\n",
       "      <td>21.65</td>\n",
       "      <td>21.73</td>\n",
       "      <td>21.75</td>\n",
       "      <td>21.65</td>\n",
       "      <td>5002</td>\n",
       "      <td>10861705</td>\n",
       "      <td>21.651</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-11-19 09:34:00</th>\n",
       "      <td>21.73</td>\n",
       "      <td>21.69</td>\n",
       "      <td>21.73</td>\n",
       "      <td>21.66</td>\n",
       "      <td>6512</td>\n",
       "      <td>14127838</td>\n",
       "      <td>21.659</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        开盘     收盘     最高     最低    成交量       成交额     最新价\n",
       "时间                                                                      \n",
       "2021-11-19 09:30:00  21.66  21.66  21.66  21.66   3208   6948528  21.660\n",
       "2021-11-19 09:31:00  21.65  21.62  21.69  21.60  11702  25326434  21.647\n",
       "2021-11-19 09:32:00  21.61  21.65  21.66  21.61   7952  17191749  21.637\n",
       "2021-11-19 09:33:00  21.65  21.73  21.75  21.65   5002  10861705  21.651\n",
       "2021-11-19 09:34:00  21.73  21.69  21.73  21.66   6512  14127838  21.659"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "033e6e78",
   "metadata": {},
   "source": [
    "# 添加特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1abb5f47",
   "metadata": {},
   "outputs": [],
   "source": [
    "datalist = list()\n",
    "for i in range(len(df)):\n",
    "    datalist.append(df.iloc[:])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "160539e0",
   "metadata": {},
   "source": [
    "## 数据检查"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "54a2df6e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function to check the missing percent of a DatFrame;\n",
    "def check_missing_data(df):\n",
    "    total = df.isnull().sum().sort_values(ascending = False)\n",
    "    percent = round(df.isnull().sum().sort_values(ascending = False) * 100 /len(df),2)\n",
    "    return pd.concat([total, percent], axis=1, keys=['Total','Percent'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "862a721d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Total</th>\n",
       "      <th>Percent</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>开盘</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>收盘</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>最高</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>最低</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>成交量</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>成交额</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>最新价</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Total  Percent\n",
       "开盘       0      0.0\n",
       "收盘       0      0.0\n",
       "最高       0      0.0\n",
       "最低       0      0.0\n",
       "成交量      0      0.0\n",
       "成交额      0      0.0\n",
       "最新价      0      0.0"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "check_missing_data(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "350f50c5",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(df.corr())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "c94543c3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.44444275 0.44444275 0.40350723 ... 0.0789418  0.07797702 0.777771  ]\n",
      " [0.4259262  0.37037277 0.45614243 ... 0.33575207 0.331144   0.6927948 ]\n",
      " [0.35185242 0.4259262  0.40350723 ... 0.2223734  0.2190837  0.6274414 ]\n",
      " ...\n",
      " [0.90740967 0.8888893  0.84210587 ... 0.19649282 0.196412   0.9738617 ]\n",
      " [0.90740967 0.9259262  0.87719345 ... 0.32244897 0.32232267 0.9869232 ]\n",
      " [0.9259262  0.9259262  0.87719345 ... 0.23579745 0.23581582 1.        ]]\n"
     ]
    }
   ],
   "source": [
    "#获取DataFrame中的数据，形式为数组array形式\n",
    "values=df.values\n",
    "#确保所有数据为float类型\n",
    "values=values.astype('float32')\n",
    " \n",
    "# 特征的归一化处理\n",
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaled = scaler.fit_transform(values)\n",
    "print(scaled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "bee1cd05",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义series_to_supervised()函数\n",
    "# 将时间序列转换为监督学习问题\n",
    "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n",
    "    \"\"\"\n",
    "    将时间序列框定为有监督的学习数据集。\n",
    "        论据：\n",
    "        数据：作为列表或NumPy数组的观察序列。\n",
    "        n_in：作为输入的滞后观测数（X）。\n",
    "        n_out：作为输出的观察数（y）。\n",
    "        dropnan：布尔值，决定是否删除具有NaN值的行。\n",
    "    返回：\n",
    "    pd.DataFrame(用于监督学习)\n",
    "    \"\"\"\n",
    "    n_vars = 1 if type(data) is list else data.shape[1]\n",
    "    df = pd.DataFrame(data)\n",
    "    cols, names = list(), list()\n",
    "    # input sequence (t-n, ... t-1)\n",
    "    for i in range(n_in, 0, -1):\n",
    "        cols.append(df.shift(i))\n",
    "        names += [('var%d(t-%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    # forecast sequence (t, t+1, ... t+n)\n",
    "    for i in range(0, n_out):\n",
    "        cols.append(df.shift(-i))\n",
    "        if i == 0:\n",
    "            names += [('var%d(t)' % (j + 1)) for j in range(n_vars)]\n",
    "        else:\n",
    "            names += [('var%d(t+%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    # put it all together\n",
    "    agg = pd.concat(cols, axis=1)\n",
    "    agg.columns = names\n",
    "    # drop rows with NaN values\n",
    "    if dropnan:\n",
    "        agg.dropna(inplace=True)\n",
    "    return agg"
   ]
  },
  {
   "cell_type": "raw",
   "id": "f331b2f2",
   "metadata": {},
   "source": [
    "该函数有四个参数：\n",
    "\n",
    "    data：输入数据需要是列表或二维的NumPy数组的观察序列。\n",
    "    n_in：输入的滞后观察数（X）。值可以在[1..len（data）]之间，可选的。默认为1。\n",
    "    n_out：输出的观察数（y）。值可以在[0..len（data）-1]之间，可选的。默认为1。\n",
    "    dropnan：Bool值，是否删除具有NaN值的行，可选的。默认为True。\n",
    "\n",
    "该函数返回一个值：\n",
    "\n",
    "    返回：用于监督学习的Pandas DataFrame。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6ef2ef1e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#将时间序列转换为监督学习问题\n",
    "reframed = series_to_supervised(scaled, 1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "76bad08c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var5(t-1)</th>\n",
       "      <th>var6(t-1)</th>\n",
       "      <th>var7(t-1)</th>\n",
       "      <th>var1(t)</th>\n",
       "      <th>var2(t)</th>\n",
       "      <th>var3(t)</th>\n",
       "      <th>var4(t)</th>\n",
       "      <th>var5(t)</th>\n",
       "      <th>var6(t)</th>\n",
       "      <th>var7(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.444443</td>\n",
       "      <td>0.444443</td>\n",
       "      <td>0.403507</td>\n",
       "      <td>0.471695</td>\n",
       "      <td>0.078942</td>\n",
       "      <td>0.077977</td>\n",
       "      <td>0.777771</td>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.370373</td>\n",
       "      <td>0.456142</td>\n",
       "      <td>0.358490</td>\n",
       "      <td>0.335752</td>\n",
       "      <td>0.331144</td>\n",
       "      <td>0.692795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.370373</td>\n",
       "      <td>0.456142</td>\n",
       "      <td>0.358490</td>\n",
       "      <td>0.335752</td>\n",
       "      <td>0.331144</td>\n",
       "      <td>0.692795</td>\n",
       "      <td>0.351852</td>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.403507</td>\n",
       "      <td>0.377357</td>\n",
       "      <td>0.222373</td>\n",
       "      <td>0.219084</td>\n",
       "      <td>0.627441</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.351852</td>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.403507</td>\n",
       "      <td>0.377357</td>\n",
       "      <td>0.222373</td>\n",
       "      <td>0.219084</td>\n",
       "      <td>0.627441</td>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.574074</td>\n",
       "      <td>0.561401</td>\n",
       "      <td>0.452827</td>\n",
       "      <td>0.133182</td>\n",
       "      <td>0.131883</td>\n",
       "      <td>0.718948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.574074</td>\n",
       "      <td>0.561401</td>\n",
       "      <td>0.452827</td>\n",
       "      <td>0.133182</td>\n",
       "      <td>0.131883</td>\n",
       "      <td>0.718948</td>\n",
       "      <td>0.574074</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.526314</td>\n",
       "      <td>0.471695</td>\n",
       "      <td>0.178836</td>\n",
       "      <td>0.176876</td>\n",
       "      <td>0.771240</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.574074</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.526314</td>\n",
       "      <td>0.471695</td>\n",
       "      <td>0.178836</td>\n",
       "      <td>0.176876</td>\n",
       "      <td>0.771240</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.462963</td>\n",
       "      <td>0.473686</td>\n",
       "      <td>0.452827</td>\n",
       "      <td>0.119788</td>\n",
       "      <td>0.118366</td>\n",
       "      <td>0.784302</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)  var5(t-1)  var6(t-1)  \\\n",
       "1   0.444443   0.444443   0.403507   0.471695   0.078942   0.077977   \n",
       "2   0.425926   0.370373   0.456142   0.358490   0.335752   0.331144   \n",
       "3   0.351852   0.425926   0.403507   0.377357   0.222373   0.219084   \n",
       "4   0.425926   0.574074   0.561401   0.452827   0.133182   0.131883   \n",
       "5   0.574074   0.500000   0.526314   0.471695   0.178836   0.176876   \n",
       "\n",
       "   var7(t-1)   var1(t)   var2(t)   var3(t)   var4(t)   var5(t)   var6(t)  \\\n",
       "1   0.777771  0.425926  0.370373  0.456142  0.358490  0.335752  0.331144   \n",
       "2   0.692795  0.351852  0.425926  0.403507  0.377357  0.222373  0.219084   \n",
       "3   0.627441  0.425926  0.574074  0.561401  0.452827  0.133182  0.131883   \n",
       "4   0.718948  0.574074  0.500000  0.526314  0.471695  0.178836  0.176876   \n",
       "5   0.771240  0.500000  0.462963  0.473686  0.452827  0.119788  0.118366   \n",
       "\n",
       "    var7(t)  \n",
       "1  0.692795  \n",
       "2  0.627441  \n",
       "3  0.718948  \n",
       "4  0.771240  \n",
       "5  0.784302  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reframed.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "aaaf7b39",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var5(t-1)</th>\n",
       "      <th>var6(t-1)</th>\n",
       "      <th>var7(t-1)</th>\n",
       "      <th>var7(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.444443</td>\n",
       "      <td>0.444443</td>\n",
       "      <td>0.403507</td>\n",
       "      <td>0.471695</td>\n",
       "      <td>0.078942</td>\n",
       "      <td>0.077977</td>\n",
       "      <td>0.777771</td>\n",
       "      <td>0.692795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.370373</td>\n",
       "      <td>0.456142</td>\n",
       "      <td>0.358490</td>\n",
       "      <td>0.335752</td>\n",
       "      <td>0.331144</td>\n",
       "      <td>0.692795</td>\n",
       "      <td>0.627441</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.351852</td>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.403507</td>\n",
       "      <td>0.377357</td>\n",
       "      <td>0.222373</td>\n",
       "      <td>0.219084</td>\n",
       "      <td>0.627441</td>\n",
       "      <td>0.718948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.425926</td>\n",
       "      <td>0.574074</td>\n",
       "      <td>0.561401</td>\n",
       "      <td>0.452827</td>\n",
       "      <td>0.133182</td>\n",
       "      <td>0.131883</td>\n",
       "      <td>0.718948</td>\n",
       "      <td>0.771240</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.574074</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.526314</td>\n",
       "      <td>0.471695</td>\n",
       "      <td>0.178836</td>\n",
       "      <td>0.176876</td>\n",
       "      <td>0.771240</td>\n",
       "      <td>0.784302</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)  var5(t-1)  var6(t-1)  \\\n",
       "1   0.444443   0.444443   0.403507   0.471695   0.078942   0.077977   \n",
       "2   0.425926   0.370373   0.456142   0.358490   0.335752   0.331144   \n",
       "3   0.351852   0.425926   0.403507   0.377357   0.222373   0.219084   \n",
       "4   0.425926   0.574074   0.561401   0.452827   0.133182   0.131883   \n",
       "5   0.574074   0.500000   0.526314   0.471695   0.178836   0.176876   \n",
       "\n",
       "   var7(t-1)   var7(t)  \n",
       "1   0.777771  0.692795  \n",
       "2   0.692795  0.627441  \n",
       "3   0.627441  0.718948  \n",
       "4   0.718948  0.771240  \n",
       "5   0.771240  0.784302  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除不想预测的特征列，这里只预测收盘价\n",
    "# 所以删除的是var1(t),var2(t),var3(t),\n",
    "reframed.drop(['var1(t)','var2(t)','var3(t)','var4(t)','var5(t)','var6(t)'], axis=1, inplace=True)\n",
    "# 打印数据的前5行\n",
    "reframed.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c52b915c",
   "metadata": {},
   "source": [
    "## 数据划分为训练集和测试集：\n",
    "\n",
    "* 将处理后的数据集划分为训练集和测试集。这里按0.85比例划分，将训练集和测试集的最终输入（X）转换为为LSTM的输入格式，即[samples,timesteps,features]。\n",
    "\n",
    "* Keras LSTM层的工作方式是通过接收3维（N，W，F）的数字阵列，其中N是训练序列的数目，W是序列长度，F是每个序列的特征数目。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "1fb4061b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(201, 1, 7) (201,)\n",
      "(36, 1, 7) (36,)\n"
     ]
    }
   ],
   "source": [
    "# 划分训练集和测试集\n",
    "train = reframed.iloc[:int(len(reframed)*0.85),:].values\n",
    "test = reframed.iloc[int(len(reframed)*0.85):,:].values\n",
    "# 划分训练集和测试集的输入和输出\n",
    "train_X, train_y = train[:, :-1], train[:, -1]\n",
    "test_X, test_y = test[:, :-1], test[:, -1]\n",
    "#转化为三维数据\n",
    "# reshape input to be 3D [samples, timesteps, features]\n",
    "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))\n",
    "print(train_X.shape, train_y.shape)\n",
    "print(test_X.shape, test_y.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f65a19c",
   "metadata": {},
   "source": [
    "# 模型构建及其预测"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "012a2906",
   "metadata": {},
   "source": [
    "* 搭建LSTM模型并绘制损失图\n",
    "    * 本实验使用keras深度学习框架对模型进行快速搭建。建立Sequential模型，向其中添加LSTM层，设定Dropout为0.5，加入Dense层将其维度聚合为1，激活函数使用relu（也用了sigmoid作为激活函数，但实验效果不如relu），损失函数定为均方差Mean Absolute Error(MAE)。优化算法采用Adam，模型采用50个epochs并且每个batch的大小为100。其中：隐藏层有64个神经元，输出层1个神经元（回归问题），输入变量是一个时间步（t-1）的特征。在fit()函数中设置validation_data参数，记录训练集和测试集的损失。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3ee2975",
   "metadata": {},
   "source": [
    "### 预测一次，并保存预测结构，用于之后的验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b71edde8",
   "metadata": {},
   "outputs": [],
   "source": [
    "checkpoint_save_path = \"./checkpoint/test_4_1.ckpt\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "e85a0f7c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 save_best_only=True,\n",
    "                                                 monitor='val_loss')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a38a1a38",
   "metadata": {},
   "source": [
    "* LSTM(neurons, input_shape=(input_timesteps, input_dim), return_sequences=return_seq)\n",
    "* Dropout(dropout_rate)\n",
    "* Dense(neurons, activation=activation)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "e41c3d1a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 7)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_X.shape[1], train_X.shape[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2738cd6d",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------load the model-----------------\n",
      "Epoch 1/50\n",
      "3/3 - 9s - loss: 0.1058 - val_loss: 0.0532 - 9s/epoch - 3s/step\n",
      "Epoch 2/50\n",
      "3/3 - 0s - loss: 0.1045 - val_loss: 0.0551 - 81ms/epoch - 27ms/step\n",
      "Epoch 3/50\n",
      "3/3 - 0s - loss: 0.1028 - val_loss: 0.0908 - 77ms/epoch - 26ms/step\n",
      "Epoch 4/50\n",
      "3/3 - 0s - loss: 0.1114 - val_loss: 0.1539 - 83ms/epoch - 28ms/step\n",
      "Epoch 5/50\n",
      "3/3 - 0s - loss: 0.1184 - val_loss: 0.1887 - 74ms/epoch - 25ms/step\n",
      "Epoch 6/50\n",
      "3/3 - 0s - loss: 0.1106 - val_loss: 0.1258 - 76ms/epoch - 25ms/step\n",
      "Epoch 7/50\n",
      "3/3 - 0s - loss: 0.0931 - val_loss: 0.0286 - 132ms/epoch - 44ms/step\n",
      "Epoch 8/50\n",
      "3/3 - 0s - loss: 0.0809 - val_loss: 0.0914 - 86ms/epoch - 29ms/step\n",
      "Epoch 9/50\n",
      "3/3 - 0s - loss: 0.0898 - val_loss: 0.0956 - 68ms/epoch - 23ms/step\n",
      "Epoch 10/50\n",
      "3/3 - 0s - loss: 0.0887 - val_loss: 0.0437 - 74ms/epoch - 25ms/step\n",
      "Epoch 11/50\n",
      "3/3 - 0s - loss: 0.0882 - val_loss: 0.0707 - 70ms/epoch - 23ms/step\n",
      "Epoch 12/50\n",
      "3/3 - 0s - loss: 0.0959 - val_loss: 0.1945 - 86ms/epoch - 29ms/step\n",
      "Epoch 13/50\n",
      "3/3 - 0s - loss: 0.1144 - val_loss: 0.2754 - 160ms/epoch - 53ms/step\n",
      "Epoch 14/50\n",
      "3/3 - 0s - loss: 0.1133 - val_loss: 0.2379 - 108ms/epoch - 36ms/step\n",
      "Epoch 15/50\n",
      "3/3 - 0s - loss: 0.0977 - val_loss: 0.1208 - 107ms/epoch - 36ms/step\n",
      "Epoch 16/50\n",
      "3/3 - 0s - loss: 0.0762 - val_loss: 0.0373 - 131ms/epoch - 44ms/step\n",
      "Epoch 17/50\n",
      "3/3 - 0s - loss: 0.0811 - val_loss: 0.1264 - 115ms/epoch - 38ms/step\n",
      "Epoch 18/50\n",
      "3/3 - 0s - loss: 0.0913 - val_loss: 0.1431 - 97ms/epoch - 32ms/step\n",
      "Epoch 19/50\n",
      "3/3 - 0s - loss: 0.0956 - val_loss: 0.0991 - 87ms/epoch - 29ms/step\n",
      "Epoch 20/50\n",
      "3/3 - 0s - loss: 0.0881 - val_loss: 0.0315 - 76ms/epoch - 25ms/step\n",
      "Epoch 21/50\n",
      "3/3 - 0s - loss: 0.0807 - val_loss: 0.0642 - 86ms/epoch - 29ms/step\n",
      "Epoch 22/50\n",
      "3/3 - 0s - loss: 0.0835 - val_loss: 0.0616 - 86ms/epoch - 29ms/step\n",
      "Epoch 23/50\n",
      "3/3 - 0s - loss: 0.0768 - val_loss: 0.0269 - 157ms/epoch - 52ms/step\n",
      "Epoch 24/50\n",
      "3/3 - 0s - loss: 0.0715 - val_loss: 0.0572 - 98ms/epoch - 33ms/step\n",
      "Epoch 25/50\n",
      "3/3 - 0s - loss: 0.0783 - val_loss: 0.0509 - 82ms/epoch - 27ms/step\n",
      "Epoch 26/50\n",
      "3/3 - 0s - loss: 0.0789 - val_loss: 0.0257 - 497ms/epoch - 166ms/step\n",
      "Epoch 27/50\n",
      "3/3 - 0s - loss: 0.0739 - val_loss: 0.0875 - 70ms/epoch - 23ms/step\n",
      "Epoch 28/50\n",
      "3/3 - 0s - loss: 0.0865 - val_loss: 0.1500 - 66ms/epoch - 22ms/step\n",
      "Epoch 29/50\n",
      "3/3 - 0s - loss: 0.0825 - val_loss: 0.1241 - 68ms/epoch - 23ms/step\n",
      "Epoch 30/50\n",
      "3/3 - 0s - loss: 0.0767 - val_loss: 0.0387 - 75ms/epoch - 25ms/step\n",
      "Epoch 31/50\n",
      "3/3 - 0s - loss: 0.0671 - val_loss: 0.0450 - 71ms/epoch - 24ms/step\n",
      "Epoch 32/50\n",
      "3/3 - 0s - loss: 0.0728 - val_loss: 0.0759 - 78ms/epoch - 26ms/step\n",
      "Epoch 33/50\n",
      "3/3 - 0s - loss: 0.0733 - val_loss: 0.1030 - 80ms/epoch - 27ms/step\n",
      "Epoch 34/50\n",
      "3/3 - 0s - loss: 0.0786 - val_loss: 0.0706 - 81ms/epoch - 27ms/step\n",
      "Epoch 35/50\n",
      "3/3 - 0s - loss: 0.0710 - val_loss: 0.0244 - 435ms/epoch - 145ms/step\n",
      "Epoch 36/50\n",
      "3/3 - 0s - loss: 0.0671 - val_loss: 0.1186 - 162ms/epoch - 54ms/step\n",
      "Epoch 37/50\n",
      "3/3 - 0s - loss: 0.0780 - val_loss: 0.2044 - 141ms/epoch - 47ms/step\n",
      "Epoch 38/50\n",
      "3/3 - 0s - loss: 0.0888 - val_loss: 0.1822 - 89ms/epoch - 30ms/step\n",
      "Epoch 39/50\n",
      "3/3 - 0s - loss: 0.0727 - val_loss: 0.0848 - 87ms/epoch - 29ms/step\n",
      "Epoch 40/50\n",
      "3/3 - 0s - loss: 0.0612 - val_loss: 0.0252 - 81ms/epoch - 27ms/step\n",
      "Epoch 41/50\n",
      "3/3 - 0s - loss: 0.0612 - val_loss: 0.0288 - 84ms/epoch - 28ms/step\n",
      "Epoch 42/50\n",
      "3/3 - 0s - loss: 0.0673 - val_loss: 0.0252 - 89ms/epoch - 30ms/step\n",
      "Epoch 43/50\n",
      "3/3 - 0s - loss: 0.0644 - val_loss: 0.0236 - 396ms/epoch - 132ms/step\n",
      "Epoch 44/50\n",
      "3/3 - 0s - loss: 0.0621 - val_loss: 0.0322 - 74ms/epoch - 25ms/step\n",
      "Epoch 45/50\n",
      "3/3 - 0s - loss: 0.0594 - val_loss: 0.0330 - 72ms/epoch - 24ms/step\n",
      "Epoch 46/50\n",
      "3/3 - 0s - loss: 0.0595 - val_loss: 0.0411 - 70ms/epoch - 23ms/step\n",
      "Epoch 47/50\n",
      "3/3 - 0s - loss: 0.0570 - val_loss: 0.0236 - 77ms/epoch - 26ms/step\n",
      "Epoch 48/50\n",
      "3/3 - 0s - loss: 0.0552 - val_loss: 0.0449 - 78ms/epoch - 26ms/step\n",
      "Epoch 49/50\n",
      "3/3 - 0s - loss: 0.0591 - val_loss: 0.0315 - 76ms/epoch - 25ms/step\n",
      "Epoch 50/50\n",
      "3/3 - 0s - loss: 0.0562 - val_loss: 0.0215 - 420ms/epoch - 140ms/step\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 搭建LSTM模型\n",
    "model = Sequential()\n",
    "\n",
    "model.add(LSTM(100, input_shape=(train_X.shape[1], train_X.shape[2]),return_sequences=True))\n",
    "\n",
    "model.add(Dropout(0.2))\n",
    "\n",
    "model.add(LSTM(100,return_sequences=True))\n",
    "model.add(LSTM(100,return_sequences=False))\n",
    "\n",
    "model.add(Dropout(0.2))\n",
    "\n",
    "model.add(Dense(1,activation='relu'))\n",
    "\n",
    "model.compile(loss='mae', optimizer='adam')\n",
    "\n",
    "if os.path.exists(checkpoint_save_path + '.index'):\n",
    "    print('-------------load the model-----------------')\n",
    "    model.load_weights(checkpoint_save_path)\n",
    "    \n",
    "# fit network\n",
    "history = model.fit(train_X, train_y, epochs=50, batch_size=100, validation_data=(test_X, test_y), verbose=2,shuffle=False,\n",
    "                    validation_freq=1,callbacks=[cp_callback])\n",
    " \n",
    "# 绘制损失图\n",
    "plt.plot(history.history['loss'], label='train')\n",
    "plt.plot(history.history['val_loss'], label='test')\n",
    "plt.title('LSTM损失图', fontsize='12')\n",
    "plt.ylabel('loss', fontsize='10')\n",
    "plt.xlabel('epoch', fontsize='10')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "134ba838",
   "metadata": {},
   "source": [
    "* 预测并反转数据（反归一化）\n",
    "    * 需要将预测结果和测试集数据组合然后进行比例反转（invert the scaling），同时需要将测试集上的预期值也进行比例转换。 \n",
    "         这里为什么进行比例反转（反归一化）呢？（因为我们将原始数据进行了预处理（连同输出值y），此时的误差损失计算是在处理之后的数据上进行的，为了计算在原始比例上的误差需要将数据进行转化。反转时的矩阵大小一定要和原来的大小（shape）完全相同，否则就会报错。）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "b024ee64",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#模型预测收益率\n",
    "y_predict = model.predict(test_X)\n",
    "test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))\n",
    " \n",
    "# invert scaling for forecast\n",
    "#将预测结果按比例反归一化\n",
    "inv_y_test = np.concatenate((test_X[:, :6],y_predict), axis=1)\n",
    "inv_y_test = scaler.inverse_transform(inv_y_test)\n",
    "inv_y_predict=inv_y_test[:,-1]\n",
    " \n",
    "# invert scaling for actual\n",
    "#将真实结果按比例反归一化\n",
    "test_y = test_y.reshape((len(test_y), 1))\n",
    "inv_y_train = np.concatenate((test_X[:, :6],test_y), axis=1)\n",
    "inv_y_train = scaler.inverse_transform(inv_y_train)\n",
    "inv_y = inv_y_train[:, -1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "9220b6f0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>反归一化后的预测结果</th>\n",
       "      <th>反归一化后的真实结果</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>21.638746</td>\n",
       "      <td>21.643999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>21.638653</td>\n",
       "      <td>21.646000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>21.645906</td>\n",
       "      <td>21.646000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>21.647150</td>\n",
       "      <td>21.646997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>21.645836</td>\n",
       "      <td>21.646997</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   反归一化后的预测结果  反归一化后的真实结果\n",
       "0   21.638746   21.643999\n",
       "1   21.638653   21.646000\n",
       "2   21.645906   21.646000\n",
       "3   21.647150   21.646997\n",
       "4   21.645836   21.646997"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.DataFrame({\"反归一化后的预测结果\":inv_y_predict,'反归一化后的真实结果':inv_y})\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "4afb1ae4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(inv_y,color='red',label='Original')\n",
    "plt.plot(inv_y_predict,color='green',label='Predict')\n",
    "plt.xlabel('the number of test data')\n",
    "plt.ylabel('close')\n",
    "plt.title('预测与实际数据图')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "7b6485c6",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "均方误差: 0.000019\n",
      "均方根误差: 0.004317\n",
      "平均绝对误差: 0.003289\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error, mean_absolute_error\n",
    "# 评估\n",
    "# calculate MSE 均方误差 ---> E[(预测值-真实值)^2] (预测值减真实值求平方后求均值)\n",
    "mse = mean_squared_error(inv_y_predict, inv_y)\n",
    "# calculate RMSE 均方根误差--->sqrt[MSE]    (对均方误差开方)\n",
    "rmse = math.sqrt(mean_squared_error(inv_y_predict, inv_y))\n",
    "# calculate MAE 平均绝对误差----->E[|预测值-真实值|](预测值减真实值求绝对值后求均值）\n",
    "mae = mean_absolute_error(inv_y_predict, inv_y)\n",
    "print('均方误差: %.6f' % mse)\n",
    "print('均方根误差: %.6f' % rmse)\n",
    "print('平均绝对误差: %.6f' % mae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "2416ac22",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率：0.9998692095603793\n"
     ]
    }
   ],
   "source": [
    "#ACC\n",
    "error = 0\n",
    "summery = 0\n",
    "for i in range(24):\n",
    "    error += abs(inv_y_predict[i] - inv_y[i])\n",
    "    summery += inv_y[i]\n",
    "acc = 1 - error/summery\n",
    "print(\"准确率：{}\".format(acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b466deff",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep",
   "language": "python",
   "name": "deep"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
